/*
 * Copyright @2007-2008 by Infowarelab Webapps.
 */
package com.parktech.sun.domain.repository;

import com.parktech.sun.domain.model.sunhz.Enterprise;
import com.parktech.sun.domain.model.sunhz.IndustryCategory;
import org.hibernate.Criteria;
import org.hibernate.Session;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

/**
 * base repository interface
 * 
 * @author power.wang
 * 
 * @param <T>
 */
public interface BaseRepository<T> {
	
	  public Session getCurrentSession() ;
    /**
	 * 持久化对象，并返回带ID的对象
	 * @param bean
	 * @return
	 */
    /**
	void save(T bean);
	
	/**
	 * 持久化对象
	 * 
	 * @param bean
	 */
	 void update(T bean);
	
	
	 T merge(T bean);
	
	/**
	 * 逻辑删除对象
	 * 
	 * @param id
	 */
	void removeBeanByLogic(long id);
	
	/**
	 * 物理删除对象
	 * 
	 * @param id
	 */
	void removeBean(long id);

    void removeBeanByLogic(Class<T> clazz, long id);

	/**
	 * 根据id获取相应的持久化对象
	 * 
	 * @param id
	 * @return
	 */
	T getBeanById(long id);

	/**
	 * 执行原生 Sql的方法 Return 结果集
	 * 
	 * @param queryStr
	 * @return
	 */
	Collection executePureSqlCol(String queryStr);

	/**
	 * 执行原生 Sql的方法 Return 结果集
	 * 
	 * @param queryStr
	 * @param values
	 * @return
	 */
	Collection executePureSqlCol(String queryStr, Object[] values);

	/**
	 * 执行原生 Sql的方法 Return 结果集
	 * 
	 * @param queryStr
	 * @param values
	 * @param startAtIndex
	 * @param count
	 * @return
	 */
	Collection executePureSqlCol(String queryStr, Object[] values, int startAtIndex, int count);
	
	/**
	 * 执行原生 Sql的方法
	 * 
	 * @param sql
	 * @return
	 */
	boolean executePureSql(String sql);
	
	/**
	 * 
	 * @return
	 */
	Criteria createCriteria();

    Criteria createCriteria(Class clazz);

	Criteria createUndeleteCriteria();
	
	/**
	 * 获取对象列表,返回所有符合条件的记录数
	 * 
	 * @param criteria
	 * @return
	 */
	int countBeans(Criteria criteria);
	

	/**
	 * 获取对象列表,if start <=0 && size <=0 then 返回所有符合条件的记录数
	 * todo
     * 这个方法定义的不是很好，方法名开头list, 说明也是说获取列表，列表是有顺序的
     * 而返回类型却是Collection, Collection本身并不保证内部元素的顺序
	 * @param criteria
	 *            查询条件
	 * @param startAtIndex
	 *            从第startAtIndex条记录开始查询
	 * @param count
	 *            查询返回的最大记录数
	 * @return collection
	 */
	Collection listBeans(Criteria criteria, int startAtIndex, int count);

    List listBeans(Criteria criteria);

	/**
	 * 原生sql分页查询，获取object数组列表
	 * 
	 * @param sql
	 * @param start
	 *            从第start条记录开始查询
	 * @param size
	 *            查询返回的最大记录数
	 * @return
	 */
	@SuppressWarnings("unchecked")
	Collection listBeansBySql(String sql, int start, int size);
	/**
	 * 持久化对象
	 * 
	 * @param bean
	 */
    public void clearThenSaveOrUpdateBean(T bean);

    /**
     * 持久化对象
     *
     * @param bean
     */
	void saveOrUpdateBean(T bean);

    void updateBean(T bean);
	/**
	 * 判断指定类的指定属性的唯一性。
	 * 
	 * @param propertyName
	 * @param id
	 * @param isIncludeDeleted
	 * @return
	 */
	boolean isRepeated(String propertyName, String propertyValue, Serializable id, boolean isIncludeDeleted);


    /**
     * 所有模块都可调用的公共分页显示方法，获取满足模糊条件的对象的总数目
     * @param clz
     * @param fieldColumns
     * @param searchValues
     * @return
     */
    public Integer getTotalSizeWithSimilarCondition(Class clz,List fieldColumns,List searchValues) ;

    /**
      * 所有模块都可调用的公共分页显示方法，获取满足模糊条件的当前分页的对象列表
      * getPaginationObjectsWithSimilarCondition(class,1,20,list['a','b'],lit['avalue','bvlaue'],string["asc","desc"],string[fiede,field])
      * @param clz   对象类
      * @param pageIndex    当前页
      * @param pageSize        每页数目
      * @param fieldColumns       类的属性数组
      * @param searchValues       类的属性数组对应的值数组
      * @param sortSchemas         每个排序的健数组对应的升降序规则：即ASC,DESC 数组
      * @param sortKeys           排序的健数组
      * @return
      */
    public List<T> getPaginationObjectsWithSimilarCondition(Class clz, final int pageIndex, final int pageSize, List fieldColumns, List searchValues,String[] sortSchemas, String[] sortKeys) ;

    public List<T> getPaginationObjectsWithSimilarConditionContainCompare(T clz, final int pageIndex, final int pageSize, List fieldColumns, List searchValues,String[] compareColumns, String[] compareDirections, Object[] compareValues,String[] sortSchemas, String[] sortKeys);

    Page<T> page(Criteria criteria, int pageNo, int pageSize);

    Page page(Criteria criteria, Page page);

    void deleteAll(Long[] enterpriseIds);

    void deleteAll(Class clazz, Long[] enterpriseIds);
}


